/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Model;

import Controller.Fournisseur;
import Controller.Marque;
import Controller.Materiel;
import Controller.Salle;
import Controller.Secteur;
import Controller.Type;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.LinkedList;
import java.util.List;

/**
 * DAO qui permet de récupérer le materiel
 *
 * @author Charly
 */
public class MaterielDAO extends AbstractDAO<Materiel> {

  private SalleDAO sDAO;

  public MaterielDAO(Connection connect) {
	super(connect);
	this.sDAO = new SalleDAO(connect);
  }

  /**
   * Insertion d'un materiel dans la base de données
   *
   * @param obj Materiel
   * @return true/false
   */
  @Override
  public boolean insert(Materiel obj) {
	try {
	  Integer idM = 0;
	  // 3..creer la requette
	  Statement stm = this.connect.createStatement();
	  // 4..executer requette
	  SimpleDateFormat d = new SimpleDateFormat("dd/MM/yy");
	  String query = "INSERT INTO materiel (numCB,numCompta,numSerie,nom,descriptif,dateHT,prixHT,garantie,numBC,budget,amortissement,idT,idF,idM,idS,idSc)"
			  + " VALUES ('" + obj.getNumCB() + "','" + obj.getNumCompta() + "','" + obj.getNumSerie() + "','" + obj.getNom() + "','" + obj.getDescriptif() + "','"
			  + d.format(obj.getDateHT()) + "','" + obj.getPrixHT() + "','" + obj.getGarantie() + "','" + obj.getNumBC() + "','" + obj.getBudget() + "','" + obj.getAmortissement()
			  + "','" + obj.getType().getIdT() + "','" + obj.getFournisseur().getId() + "','" + obj.getMarque().getIdM() + "','" + obj.getSalle().getIdS() + "','" + obj.getSecteur().getId()
			  + "');";
	  stm.executeUpdate(query);
	  stm.close();
	  return true;
	} catch (Exception e) {
	  e.printStackTrace();
	  return false;
	}
  }

  @Override
  protected boolean update(Materiel obj) {
	throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  protected boolean delete(Materiel obj) {
	throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  protected Materiel findById(int id) {
	throw new UnsupportedOperationException("Not supported yet.");
  }

  /**
   * Retourner une map contenant les materiels avec leurs salle
   * respective(valeur)
   *
   * @param lesCB : List<String>
   * @param numSalle : Integer
   * @return Map<Materiel, Integer>
   *
   */
  public Map<Materiel, Integer> materielEstDansSalle(List<String> lesCB, Integer numSalle) {
	try {
	  Map<Materiel, Integer> bigMap = new HashMap<>();
	  for (String e : lesCB) {
		ResultSet res = this.connect.createStatement(
				ResultSet.TYPE_SCROLL_INSENSITIVE,
				ResultSet.CONCUR_READ_ONLY).executeQuery("SELECT nom,idS FROM Materiel WHERE numCB = " + Long.valueOf(e.toString()));
		if (res.first()) {
		  //Mat présent
		  if (res.getInt(2) == numSalle) {
			Materiel mat = new Materiel();
			mat.setNumCB(Long.valueOf(e.toString()));
			mat.setNom(res.getString(1));
			mat.setSalle(this.sDAO.findById(res.getInt(2)));
			bigMap.put(mat, 0);
		  } //Pas dans la salle
		  else {
			Materiel mat = new Materiel();
			mat.setNumCB(Long.valueOf(e.toString()));
			mat.setNom(res.getString(1));
			mat.setSalle(this.sDAO.findById(res.getInt(2)));
			bigMap.put(mat, 1);
		  }
		}
	  }
	  return bigMap;
	} catch (Exception e) {
	  e.printStackTrace();
	  return null;
	}
  }

  /**
   * return la liste des materiels qui sont dans la base mais pas dans le
   * fichier txt
   *
   * @param lesCB : List<String>
   * @param numSalle : Integer
   * @return Map<Materiel,Integer>
   *
   */
  public Map<Materiel, Integer> materielEstDansTxt(List<String> lesCB, Integer numSalle) {
	try {
	  Map<Materiel, Integer> matManquant = new HashMap();
	  List<Materiel> matOfSalle = this.findBySalle(numSalle);

	  for (Materiel m : matOfSalle) {
		boolean trouver = false;
		for (String s : lesCB) {
		  if (s == String.valueOf(m.getNumCB())) {
			trouver = true;
		  }
		}
		if (!trouver) {
		  matManquant.put(m, numSalle);
		}
	  }
	  return matManquant;

	} catch (Exception e) {
	  e.printStackTrace();
	  return null;
	}
  }

  /**
   * Fonction pour récupérer le materiel d'une salle
   *
   * @param idS : Id de la salle
   * @return List<Materiel> lesMat
   */
  public List<Materiel> findBySalle(int idS) {
	try {
	  List<Materiel> lesMat = new LinkedList();

	  ResultSet res = this.connect.createStatement(
			  ResultSet.TYPE_SCROLL_INSENSITIVE,
			  ResultSet.CONCUR_READ_ONLY).executeQuery("SELECT * FROM Materiel WHERE idS = " + idS);
	  while (res.next()) {
		Materiel mat = new Materiel();
		mat.setNumCB(res.getLong(1));
		mat.setNumCompta(res.getInt(2));
		mat.setNumSerie(res.getString(3));
		mat.setNom(res.getString(4));
		mat.setDescriptif(res.getString(5));
		mat.setDateHT(res.getDate(6));
		mat.setPrixHT(res.getDouble(7));
		mat.setGarantie(res.getInt(8));
		mat.setNumBC(res.getString(9));
		mat.setBudget(res.getString(10));
		mat.setAmortissement(res.getInt(11));

		//Recup le type
		Type type = new Type();
		TypeDAO typeDAO = new TypeDAO(connect);
		type = typeDAO.findById(res.getInt(12));
		mat.setType(type);

		//Recup le fournisseur
		Fournisseur fournisseur = new Fournisseur();
		FournisseurDAO fournisseurDAO = new FournisseurDAO(connect);
		fournisseur = fournisseurDAO.findById(res.getInt(13));
		mat.setFournisseur(fournisseur);

		//Recup la marque
		Marque marque = new Marque();
		MarqueDAO marqueDAO = new MarqueDAO(connect);
		marque = marqueDAO.findById(res.getInt(14));
		mat.setMarque(marque);

		// Recup salle
		Salle salle = new Salle();
		SalleDAO salleDAO = new SalleDAO(connect);
		salle = salleDAO.findById(res.getInt(15));
		mat.setSalle(salle);

		//Recup le Secteur
		Secteur secteur = new Secteur();
		SecteurDAO secteurDAO = new SecteurDAO(connect);
		secteur = secteurDAO.findById(res.getInt(16));
		mat.setSecteur(secteur);

		lesMat.add(mat);
	  }
	  return lesMat;
	} catch (Exception e) {
	  e.printStackTrace();
	  return null;
	}
  }

  /**
   * Fonction pour récupérer le materiel d'un type
   *
   * @param idT : Id du Type
   * @return List<Materiel> lesMat
   */
  public List<Materiel> findByType(String idT) {
	try {
	  List<Materiel> lesMat = new LinkedList();

	  ResultSet res = this.connect.createStatement(
			  ResultSet.TYPE_SCROLL_INSENSITIVE,
			  ResultSet.CONCUR_READ_ONLY).executeQuery("SELECT * FROM Materiel WHERE idT = " + idT);
	  while (res.next()) {
		Materiel mat = new Materiel();
		mat.setNumCB(res.getLong(1));
		mat.setNumCompta(res.getInt(2));
		mat.setNumSerie(res.getString(3));
		mat.setNom(res.getString(4));
		mat.setDescriptif(res.getString(5));
		mat.setDateHT(res.getDate(6));
		mat.setPrixHT(res.getDouble(7));
		mat.setGarantie(res.getInt(8));
		mat.setNumBC(res.getString(9));
		mat.setBudget(res.getString(10));
		mat.setAmortissement(res.getInt(11));

		//Recup le type
		Type type = new Type();
		TypeDAO typeDAO = new TypeDAO(connect);
		type = typeDAO.findById(res.getInt(12));
		mat.setType(type);

		//Recup le fournisseur
		Fournisseur fournisseur = new Fournisseur();
		FournisseurDAO fournisseurDAO = new FournisseurDAO(connect);
		fournisseur = fournisseurDAO.findById(res.getInt(13));
		mat.setFournisseur(fournisseur);

		//Recup la marque
		Marque marque = new Marque();
		MarqueDAO marqueDAO = new MarqueDAO(connect);
		marque = marqueDAO.findById(res.getInt(14));
		mat.setMarque(marque);

		// Recup salle
		Salle salle = new Salle();
		SalleDAO salleDAO = new SalleDAO(connect);
		salle = salleDAO.findById(res.getInt(15));
		mat.setSalle(salle);

		//Recup le Secteur
		Secteur secteur = new Secteur();
		SecteurDAO secteurDAO = new SecteurDAO(connect);
		secteur = secteurDAO.findById(res.getInt(16));
		mat.setSecteur(secteur);

		lesMat.add(mat);
	  }
	  return lesMat;
	} catch (Exception e) {
	  e.printStackTrace();
	  return null;
	}
  }

  /**
   * Recupère le matos d'une salle et d'un type
   *
   * @param idT : id du type
   * @param idS : id de la salle
   * @return List<Materiel>
   */
  public List<Materiel> findByTypeEtSalle(String idT, int idS) {
	try {
	  List<Materiel> lesMat = new LinkedList();

	  ResultSet res = this.connect.createStatement(
			  ResultSet.TYPE_SCROLL_INSENSITIVE,
			  ResultSet.CONCUR_READ_ONLY).executeQuery("SELECT * FROM Materiel WHERE idT = " + idT + " AND idS = " + idS);
	  while (res.next()) {
		Materiel mat = new Materiel();
		mat.setNumCB(res.getLong(1));
		mat.setNumCompta(res.getInt(2));
		mat.setNumSerie(res.getString(3));
		mat.setNom(res.getString(4));
		mat.setDescriptif(res.getString(5));
		mat.setDateHT(res.getDate(6));
		mat.setPrixHT(res.getDouble(7));
		mat.setGarantie(res.getInt(8));
		mat.setNumBC(res.getString(9));
		mat.setBudget(res.getString(10));
		mat.setAmortissement(res.getInt(11));

		//Recup le type
		Type type = new Type();
		TypeDAO typeDAO = new TypeDAO(connect);
		type = typeDAO.findById(res.getInt(12));
		mat.setType(type);

		//Recup le fournisseur
		Fournisseur fournisseur = new Fournisseur();
		FournisseurDAO fournisseurDAO = new FournisseurDAO(connect);
		fournisseur = fournisseurDAO.findById(res.getInt(13));
		mat.setFournisseur(fournisseur);

		//Recup la marque
		Marque marque = new Marque();
		MarqueDAO marqueDAO = new MarqueDAO(connect);
		marque = marqueDAO.findById(res.getInt(14));
		mat.setMarque(marque);

		// Recup salle
		Salle salle = new Salle();
		SalleDAO salleDAO = new SalleDAO(connect);
		salle = salleDAO.findById(res.getInt(15));
		mat.setSalle(salle);

		//Recup le Secteur
		Secteur secteur = new Secteur();
		SecteurDAO secteurDAO = new SecteurDAO(connect);
		secteur = secteurDAO.findById(res.getInt(16));
		mat.setSecteur(secteur);

		lesMat.add(mat);
	  }
	  return lesMat;
	} catch (Exception e) {
	  e.printStackTrace();
	  return null;
	}
  }

  /**
   * Retourne l'id du materiel le plus élévé en fonction des id du CB de la base
   *
   * @return String
   */
  public String getIdCb() {
	try {
	  String identifiantMateriel = null;

	  // 3..creer la requette
	  Statement stm = this.connect.createStatement();

	  // 4..executer requette qui recupere les codes barre
	  ResultSet res = stm.executeQuery("SELECT numCB FROM materiel");

	  String idTemp;
	  int idTempInt = 0;
	  int idTempsInt2 = 0;

	  while (res.next()) {

		// on selectionne seulement l identifiant dans tout le code barre
		NumberFormat tata = NumberFormat.getInstance();
		double d = res.getDouble(1);
		String s = tata.format(d);
		String[] idDecompose = tata.format(d).split("");

		idTemp = idDecompose[11] + idDecompose[12] + idDecompose[13] + idDecompose[15] + idDecompose[16];

		idTempsInt2 = Integer.valueOf(idTemp);

		// on selectionne l identifiant le plus grand
		if (idTempsInt2 >= idTempInt) {
		  idTempInt = idTempsInt2;
		}
	  }

	  // on definit le nouvel identifiant
	  idTempInt = idTempInt + 1;
	  identifiantMateriel = String.valueOf(idTempInt);

	  // on ajoute des 0 pour retrouver le format sur 5 chiffres
	  while (identifiantMateriel.length() < 5) {
		identifiantMateriel = "0" + identifiantMateriel;
	  }

	  stm.close();

	  return identifiantMateriel;

	} catch (Exception e) {
	  e.printStackTrace();
	  return null;
	}
  }

  /**
   * Recupere le materiel en fonction du CB
   *
   * @param CB Long
   * @return List<Materiel> lesMat
   */
  public List<Materiel> findByCB(Long CB) {
	try {
	  List<Materiel> lesMat = new LinkedList();

	  ResultSet res = this.connect.createStatement(
			  ResultSet.TYPE_SCROLL_INSENSITIVE,
			  ResultSet.CONCUR_READ_ONLY).executeQuery("SELECT * FROM Materiel WHERE numCB = " + CB);
	  while (res.next()) {
		Materiel mat = new Materiel();
		mat.setNumCB(res.getLong(1));
		mat.setNumCompta(res.getInt(2));
		mat.setNumSerie(res.getString(3));
		mat.setNom(res.getString(4));
		mat.setDescriptif(res.getString(5));
		mat.setDateHT(res.getDate(6));
		mat.setPrixHT(res.getDouble(7));
		mat.setGarantie(res.getInt(8));
		mat.setNumBC(res.getString(9));
		mat.setBudget(res.getString(10));
		mat.setAmortissement(res.getInt(11));

		//Recup le type
		Type type = new Type();
		TypeDAO typeDAO = new TypeDAO(connect);
		type = typeDAO.findById(res.getInt(12));
		mat.setType(type);

		//Recup le fournisseur
		Fournisseur fournisseur = new Fournisseur();
		FournisseurDAO fournisseurDAO = new FournisseurDAO(connect);
		fournisseur = fournisseurDAO.findById(res.getInt(13));
		mat.setFournisseur(fournisseur);

		//Recup la marque
		Marque marque = new Marque();
		MarqueDAO marqueDAO = new MarqueDAO(connect);
		marque = marqueDAO.findById(res.getInt(14));
		mat.setMarque(marque);

		// Recup salle
		Salle salle = new Salle();
		SalleDAO salleDAO = new SalleDAO(connect);
		salle = salleDAO.findById(res.getInt(15));
		mat.setSalle(salle);

		//Recup le Secteur
		Secteur secteur = new Secteur();
		SecteurDAO secteurDAO = new SecteurDAO(connect);
		secteur = secteurDAO.findById(res.getInt(16));
		mat.setSecteur(secteur);

		lesMat.add(mat);
	  }
	  return lesMat;
	} catch (Exception e) {
	  e.printStackTrace();
	  return null;
	}
  }
}
